package cn.topcode.unicorn.utils;

import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * 摘要工具
 * 包括MD5和SHA-1摘要算法
 * @author Unicorn Lien
 * 2016年10月18日 上午1:23:33 创建
 */
public class DigestUtil {
    
    public static final String ALGORITHM_MD5 = "MD5";
    public static final String ALGORITHM_SHA1 = "SHA-1";
    
    private DigestUtil() {}

    /**
     * MD5摘要
     * @author Leo Lien
     * 2016年10月19日 下午3:38:53 创建
     * @param src
     * @return
     */
    public static String md5(String src) {
        try {
            byte[] encryptStr = digest(src.getBytes(Charset.forName("UTF-8")), ALGORITHM_MD5);
           return ByteUtil.byte2Hex(encryptStr);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return "";
    }

    /**
     * SHA-1摘要
     * @author Leo Lien
     * 2016年10月19日 下午3:41:17 创建
     * @param src
     * @return
     */
    public static String sha1(String src) {
        byte[] encryptStr = sha1(src.getBytes(Charset.forName("UTF-8")));
        return ByteUtil.byte2Hex(encryptStr);
    }

    public static byte[] sha1(byte[] src) {
        try {
            return digest(src, ALGORITHM_SHA1);
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }
    
    /**
     * 按指定算法进行摘要
     * @author Leo Lien
     * 2016年10月19日 下午3:56:38 创建
     * @param src
     * @param algorithm
     * @return
     * @throws NoSuchAlgorithmException
     */
    public static byte[] digest(byte[] src, String algorithm) throws NoSuchAlgorithmException {
        MessageDigest mdInst = MessageDigest.getInstance(algorithm);
        // 通过使用 update 方法处理数据,使指定的 byte数组更新摘要
        mdInst.update(src);
        //  获得密文完成哈希计算,产生128 位的长整数
        return mdInst.digest();
    }
    
    public static String sha1b40(String decript) {
        try {
            MessageDigest digest = java.security.MessageDigest
                    .getInstance("SHA-1");
            digest.update(decript.getBytes(Charset.forName("UTF-8")));
            byte[] messageDigest = digest.digest();
            // Create Hex String
            StringBuilder hexString = new StringBuilder();
            // 字节数组转换为 十六进制 数
            for (int i = 0; i < messageDigest.length; i++) {
                String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
                if (shaHex.length() < 2) {
                    hexString.append(0);
                }
                hexString.append(shaHex);
            }
            return hexString.toString();

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return "";
    }
}
